1 00:00:00,420 --> 00:00:01,350 Welcome back. 2 00:00:01,350 --> 00:00:03,030 We're nearly complete with our game. 3 00:00:03,030 --> 00:00:07,560 The only thing left for us to do is script the system that will be responsible for handling any developer 4 00:00:07,560 --> 00:00:09,150 product purchases in our game. 5 00:00:09,150 --> 00:00:14,100 If you don't know what a developer product is, it's basically the same thing as a Game Pass, but they 6 00:00:14,100 --> 00:00:18,930 can be purchased multiple times like revives, in-game currency and stuff like that. 7 00:00:18,930 --> 00:00:24,900 So we want to give our players the ability to respawn into the map after they die by purchasing a cheap 8 00:00:24,900 --> 00:00:30,240 developer product, maybe like 20 Robux so they can have another shop of escaping and winning the game. 9 00:00:30,240 --> 00:00:35,310 To do this, we have a button inside of our GUI inside of the spectating frame that the players can 10 00:00:35,310 --> 00:00:39,690 press to respawn, and when they press this button, what we could do is we could fire an event to the 11 00:00:39,690 --> 00:00:44,940 server to request for a respawn, and which the server will prompt for us to purchase a developer product. 12 00:00:44,940 --> 00:00:49,020 And when we purchase that developer product, the server will handle the rest of the functionality for 13 00:00:49,020 --> 00:00:50,670 that specific developer product. 14 00:00:50,790 --> 00:00:55,740 So in our case, when a player hits this respawn button, we want to prompt them to purchase a developer 15 00:00:55,740 --> 00:00:56,220 product. 16 00:00:56,220 --> 00:01:02,160 And when they purchase that developer product, we can basically respawn their character by selecting 17 00:01:02,160 --> 00:01:06,450 one of these different respawn points that we have in the basement, and we can calculate which one 18 00:01:06,450 --> 00:01:11,910 for the player to respawn at by determining which respawn point is farthest away from our AI. 19 00:01:11,940 --> 00:01:12,540 Squidward. 20 00:01:12,540 --> 00:01:17,190 Because we don't want to respawn the player directly on our AI and have them die immediately, that 21 00:01:17,190 --> 00:01:18,720 wouldn't really be fair. 22 00:01:18,720 --> 00:01:23,880 So we're going to use this response system and check which respawn point is best for our players to 23 00:01:23,880 --> 00:01:29,070 respawn at, and we'll give them their tools back, like a flashlight and a glow stick and things like 24 00:01:29,070 --> 00:01:32,610 that to give them another shot at trying to escape the basement. 25 00:01:32,850 --> 00:01:36,690 So let me go ahead and disable the visibility on our spectate frame. 26 00:01:36,690 --> 00:01:40,260 And in order to do this, we're going to have to create a new developer product. 27 00:01:40,260 --> 00:01:45,300 So we can do that by going to file hitting game settings and going to the monetization tab. 28 00:01:45,300 --> 00:01:48,450 And inside of here we have a section to create a developer product. 29 00:01:48,450 --> 00:01:49,650 So we can hit this. 30 00:01:49,650 --> 00:01:51,840 And as you can see we have a new developer product here. 31 00:01:51,840 --> 00:01:54,120 And we can go ahead and edit this developer product. 32 00:01:54,120 --> 00:01:56,520 And I'm going to give this name respawn. 33 00:01:56,520 --> 00:01:57,900 But you can name it whatever you like. 34 00:01:57,900 --> 00:02:00,120 And you can go ahead and set a price for this one. 35 00:02:00,120 --> 00:02:03,120 We could do something like 20 Robux and then you can hit save. 36 00:02:03,810 --> 00:02:08,820 And then from this point we can go back to game settings, go back to monetization, and here's our 37 00:02:08,820 --> 00:02:09,540 developer product. 38 00:02:09,540 --> 00:02:13,350 And we can go ahead and copy this ID because we're going to need it for later. 39 00:02:13,970 --> 00:02:15,890 And then we can go ahead and close out of this. 40 00:02:16,070 --> 00:02:21,710 So what the plan is, is that inside of our main UI handler, inside of our spectate frame, when we 41 00:02:21,740 --> 00:02:29,060 hit that respawn button, we would want to use our game comms event to fire to the server to request 42 00:02:29,060 --> 00:02:29,870 a respawn. 43 00:02:29,870 --> 00:02:36,230 So remember inside of our game comms enum, in the two server section, we have an action of requesting 44 00:02:36,230 --> 00:02:43,190 a respawn so we can fire this action to the server, and the server will determine what to do when we 45 00:02:43,190 --> 00:02:44,660 give them this action. 46 00:02:44,660 --> 00:02:50,000 So you can go ahead and open up your developer products, service and product ID enum inside of server 47 00:02:50,000 --> 00:02:54,230 Script service and inside of here we're going to need several services. 48 00:02:54,230 --> 00:02:56,390 One is going to be Replicated storage. 49 00:02:58,230 --> 00:03:00,870 We're also going to need server storage. 50 00:03:04,100 --> 00:03:06,290 We're going to need the team service. 51 00:03:08,790 --> 00:03:12,060 And we're also going to need the marketplace service. 52 00:03:12,300 --> 00:03:15,570 So game get service marketplace service. 53 00:03:15,570 --> 00:03:18,000 And lastly we're going to need the player service. 54 00:03:20,950 --> 00:03:22,780 Now inside of our product id enum. 55 00:03:22,780 --> 00:03:27,610 This is where we're going to store all of the possible different developer product IDs. 56 00:03:27,610 --> 00:03:30,520 So I'm just going to paste my ID in there real quick. 57 00:03:30,730 --> 00:03:35,230 And from this point I'm just going to go into something like replicated storage and copy one of these 58 00:03:35,230 --> 00:03:39,730 enums, just copy all this stuff in here, and then I could just paste it in here. 59 00:03:39,730 --> 00:03:42,010 And what I'll do is I'll re copy my ID. 60 00:03:42,780 --> 00:03:50,700 And delete all the stuff in here, and I'll just create a new key value pair for my respawn ID, so 61 00:03:50,700 --> 00:03:52,410 I can call this respawn. 62 00:03:52,410 --> 00:03:56,910 And all it's going to be equal to is our developer product ID, just like that. 63 00:03:56,910 --> 00:03:59,490 Then we can go back to our developer product service. 64 00:03:59,490 --> 00:04:02,580 We can go ahead and create the table to represent the service. 65 00:04:02,580 --> 00:04:04,620 So we can call it product service. 66 00:04:04,650 --> 00:04:08,280 We go to a table and we'll make sure to return this at the end of our script. 67 00:04:09,670 --> 00:04:13,630 And then we're also going to go ahead and get our product ID numb. 68 00:04:14,750 --> 00:04:19,520 So we'll require from our script dot product id num. 69 00:04:20,930 --> 00:04:25,700 And we're going to have to also get our game comms event, which is in replicated storage, dot events, 70 00:04:25,700 --> 00:04:27,740 dot remotes, dot game communication. 71 00:04:27,740 --> 00:04:33,320 And then we're going to have to get our game comms enum require replicated storage, dot modules dot 72 00:04:33,320 --> 00:04:35,330 enums, dot game communication. 73 00:04:37,200 --> 00:04:42,510 We're also going to make a reference to our AI, Squidward, because we're going to need him for when 74 00:04:42,510 --> 00:04:47,790 we need to respawn a player, because we need to tell which respawn point is farthest away from our 75 00:04:47,790 --> 00:04:47,970 AI. 76 00:04:48,000 --> 00:04:48,540 Squidward. 77 00:04:48,540 --> 00:04:51,870 So we'll just make a reference to him and he's inside of server storage. 78 00:04:52,470 --> 00:04:53,430 Other stuff. 79 00:04:53,790 --> 00:04:55,020 Handsome Squidward. 80 00:04:55,050 --> 00:04:55,560 I. 81 00:04:56,480 --> 00:05:01,640 And they're also going to get all the different respawn points that are inside of our basement. 82 00:05:02,850 --> 00:05:05,460 And that's in the workspace filtering folder. 83 00:05:05,790 --> 00:05:07,320 Respawn points. 84 00:05:07,320 --> 00:05:10,230 And there's the basement respawn points. 85 00:05:10,230 --> 00:05:12,750 And we're going to get all of the children inside of there. 86 00:05:13,570 --> 00:05:18,220 Another thing we're going to want to make sure of is to have a cool down for our event. 87 00:05:18,220 --> 00:05:23,170 So we don't want a player to keep spam clicking that respawn event, and we don't want to keep constantly 88 00:05:23,170 --> 00:05:26,020 prompting a purchase to the player so we can create a table. 89 00:05:26,020 --> 00:05:27,850 I'll call it prompt cooldown. 90 00:05:29,150 --> 00:05:35,150 Or cooldowns, prompt cooldowns, and this will just keep track of when the player last fired that event. 91 00:05:35,150 --> 00:05:41,120 So we don't, you know, spam them with a prompt purchase every few seconds so we can create a constant. 92 00:05:42,240 --> 00:05:46,770 And we can call it prompt cool down and we could do something like five seconds. 93 00:05:47,570 --> 00:05:52,580 From this point, we can go ahead and create the initialize function for our product service. 94 00:05:53,200 --> 00:05:54,040 In it. 95 00:05:54,040 --> 00:05:58,120 And this is going to listen to our Game Comms event on server event. 96 00:05:58,570 --> 00:06:00,970 And we can connect a private function to it. 97 00:06:00,970 --> 00:06:02,440 So we could create a function. 98 00:06:02,440 --> 00:06:05,170 We could call it on game Comms event. 99 00:06:06,620 --> 00:06:09,380 And we could connect that to this event. 100 00:06:09,800 --> 00:06:14,420 And there's also another event we want to listen to inside of the marketplace service. 101 00:06:14,420 --> 00:06:18,050 Or more exactly, it's called process receipt. 102 00:06:18,050 --> 00:06:25,160 And this is actually a function that we need to supply to this, uh, property because this is a callback 103 00:06:25,160 --> 00:06:25,700 property. 104 00:06:25,700 --> 00:06:31,760 So any time anybody in our game purchases a developer product, this process receipt function is going 105 00:06:31,760 --> 00:06:32,270 to be called. 106 00:06:32,270 --> 00:06:35,930 And we need to handle any products that get purchased in our game. 107 00:06:35,930 --> 00:06:37,460 We have to have full control of that. 108 00:06:37,460 --> 00:06:41,390 And we have the full responsibility of processing and developer products. 109 00:06:41,390 --> 00:06:43,940 So we could also create another function in here. 110 00:06:44,490 --> 00:06:47,070 And we could call it process receipt. 111 00:06:47,930 --> 00:06:53,450 And this is the function that's going to be processing every single purchase that is made inside of 112 00:06:53,450 --> 00:06:54,170 our game. 113 00:06:54,770 --> 00:07:00,170 Now inside of our on game comms event function, we're going to get the player and the action that this 114 00:07:00,170 --> 00:07:06,440 player wants us to do, and we want to verify that this action is equal to our game comms enum dot two 115 00:07:06,470 --> 00:07:08,990 server dot request respawn. 116 00:07:08,990 --> 00:07:16,220 If it is, then what we could do is we could use our marketplace service and prompt a product purchase 117 00:07:16,220 --> 00:07:17,240 to this player. 118 00:07:17,240 --> 00:07:22,190 We're going to pass the player instance, and the ID or the product we wish to prompt to them is going 119 00:07:22,190 --> 00:07:23,540 to be in our product ID enum. 120 00:07:23,540 --> 00:07:26,090 And that's going to be our respawn product. 121 00:07:26,330 --> 00:07:27,800 Now some things we want to verify. 122 00:07:27,830 --> 00:07:32,780 First of all is we want to make sure that they haven't spam clicked this, uh, remote event or they 123 00:07:32,780 --> 00:07:34,340 aren't spamming this remote event. 124 00:07:34,340 --> 00:07:43,070 So we can basically, uh, set inside of the prompt cooldowns for this particular player equal to the 125 00:07:43,070 --> 00:07:44,120 current tick. 126 00:07:44,300 --> 00:07:52,370 So if this player does not have a key inside of our prompt cooldowns table, then we create one for 127 00:07:52,370 --> 00:07:53,300 them right here. 128 00:07:54,680 --> 00:07:59,720 Otherwise, what we could do is we could check if the current tick subtracted by when they last fired 129 00:07:59,720 --> 00:08:00,650 this event. 130 00:08:02,140 --> 00:08:07,420 Is less than our prompt cooldown, so that means they're firing this event way too often. 131 00:08:07,420 --> 00:08:09,670 If that's the case, then we're just going to return. 132 00:08:10,500 --> 00:08:10,920 Otherwise. 133 00:08:10,920 --> 00:08:14,790 Another thing we need to make sure of is that this player is actually on the dead team. 134 00:08:14,790 --> 00:08:22,050 So if this player team is not equal to teams dead, then obviously we can't, you know, respawn them, 135 00:08:22,050 --> 00:08:25,620 they're already on the map, so there's no point to prompt them this purchase. 136 00:08:25,860 --> 00:08:32,850 And another thing we want to verify is if the number of people on the alive team get players, we want 137 00:08:32,850 --> 00:08:35,010 to make sure that is greater than zero. 138 00:08:35,010 --> 00:08:40,650 If it's equal to zero, then that means all the players in our game have died and the game is over. 139 00:08:40,650 --> 00:08:45,720 So we don't want any players to be able to purchase this respawn product because the game is done, 140 00:08:45,720 --> 00:08:46,410 it's over. 141 00:08:46,410 --> 00:08:48,390 So we're just going to return. 142 00:08:49,080 --> 00:08:54,240 Otherwise, we prompt them to purchase this respawn product and if they do purchase it, that's when 143 00:08:54,240 --> 00:08:56,970 our process receipt function gets called. 144 00:08:56,970 --> 00:09:03,060 So inside of this process receipt function, we get passed something called a receipt info. 145 00:09:03,060 --> 00:09:06,000 And this receipt info contains several information. 146 00:09:06,000 --> 00:09:10,050 It first contains who exactly purchased this product. 147 00:09:10,050 --> 00:09:13,920 And it also provides to us the ID of the product that was purchased. 148 00:09:13,920 --> 00:09:18,420 So for example, we can get the player that purchased this product using the function and the player 149 00:09:18,420 --> 00:09:24,450 service, get player by user ID, and we're going to pass inside of this receipt info. 150 00:09:24,450 --> 00:09:26,520 There's a key called player ID. 151 00:09:27,000 --> 00:09:30,660 And we can try to get the player instance who purchased this. 152 00:09:30,660 --> 00:09:35,550 If this player for some reason is not in our game, let's say they left the game as soon as they purchased 153 00:09:35,550 --> 00:09:36,630 this developer product. 154 00:09:36,630 --> 00:09:38,850 Well, we don't want to do anything at all. 155 00:09:39,390 --> 00:09:48,000 And this function has to return an enum of product purchase decision to let our game know what exactly 156 00:09:48,000 --> 00:09:53,250 we're going to do when this process receipt function gets called, and if our player is not in the game, 157 00:09:53,250 --> 00:09:56,280 then we don't want to charge them for this developer product. 158 00:09:56,280 --> 00:10:02,490 So what we're going to do is we're going to return the enum dot product purchase decision dot not processed 159 00:10:02,490 --> 00:10:03,210 yet. 160 00:10:03,210 --> 00:10:08,310 So we're not going to process this order and we're not going to charge them because they left the game 161 00:10:08,310 --> 00:10:10,080 while they tried to purchase it. 162 00:10:10,590 --> 00:10:11,400 Otherwise. 163 00:10:11,400 --> 00:10:16,710 If everything works out, then we can execute some functionality based on the ID of the product that 164 00:10:16,710 --> 00:10:17,670 was purchased. 165 00:10:18,300 --> 00:10:20,340 So what we can do is we can create a table up here. 166 00:10:20,340 --> 00:10:23,340 And I'm going to call this product functions. 167 00:10:23,920 --> 00:10:30,880 And inside of this table, we can create a whole bunch of different functions based on the ID of the 168 00:10:30,880 --> 00:10:32,380 developer product as the key. 169 00:10:32,410 --> 00:10:37,870 So inside of the product functions table, the key we could pass here is going to be our product id 170 00:10:37,870 --> 00:10:40,480 enum dot respawn. 171 00:10:41,120 --> 00:10:43,520 And we can set this equal to a lambda function. 172 00:10:43,520 --> 00:10:46,490 And we would have this function get past the player. 173 00:10:46,790 --> 00:10:53,270 And from this point what we would do is we would respawn the player because they purchased our respawn 174 00:10:53,390 --> 00:10:54,290 product. 175 00:10:54,590 --> 00:11:00,230 So inside of our process receipt function, after we verify that the player is in the game, we can 176 00:11:00,230 --> 00:11:05,960 refer to our product functions table and pass the receipt info. 177 00:11:06,700 --> 00:11:09,970 And get the product ID that was purchased. 178 00:11:09,970 --> 00:11:15,070 And then we can call this function and pass the player that purchased the product. 179 00:11:15,070 --> 00:11:20,140 And after all that functionality is completed for this particular developer product, then we can go 180 00:11:20,140 --> 00:11:25,690 ahead and return the enum dot product purchase decision dot purchase granted. 181 00:11:25,690 --> 00:11:27,040 So we charge them. 182 00:11:27,040 --> 00:11:31,930 Everything went great and the server handled all of the functionality for this particular developer 183 00:11:31,930 --> 00:11:32,590 product. 184 00:11:33,100 --> 00:11:36,400 So what do we want to do when we want to respawn our player? 185 00:11:36,400 --> 00:11:41,140 Well, first of all we need to figure out which respawn point to respawn them at. 186 00:11:41,140 --> 00:11:43,000 So that means we're going to create a variable. 187 00:11:43,000 --> 00:11:49,660 I'm going to call this selected respawn point, and I'm just going to set this to null for now. 188 00:11:49,660 --> 00:11:52,630 And then we also need a variable I'm going to call it last distance. 189 00:11:52,630 --> 00:11:55,660 And I'll just set it to some randomly high number like 10,000. 190 00:11:56,270 --> 00:12:01,400 And what we need to do is we need to loop through every single respawn point inside of our respawn points 191 00:12:01,400 --> 00:12:02,630 and basement table. 192 00:12:02,630 --> 00:12:07,610 And what we need to do is calculate the distance from our I, Squidward to this point. 193 00:12:07,610 --> 00:12:09,470 So we get this respawn point. 194 00:12:10,110 --> 00:12:11,490 We get the position. 195 00:12:12,530 --> 00:12:19,850 And we subtract that by the I Squidward humanoid root part and get that position and get the total magnitude 196 00:12:19,850 --> 00:12:21,410 between these two points. 197 00:12:22,130 --> 00:12:26,690 If this distance we just calculated is greater than our last distance. 198 00:12:26,690 --> 00:12:33,440 So actually we need to set this value to zero and not 10,000 because we're calculating which point is 199 00:12:33,440 --> 00:12:36,260 farthest away and not which point is closest. 200 00:12:36,260 --> 00:12:42,170 So if this distance is greater than the last distance, then we can set last distance equal to this 201 00:12:42,170 --> 00:12:48,860 distance we just calculated and set the selected respawn point equal to this respawn point. 202 00:12:49,280 --> 00:12:54,020 After we loop through all of the different respawn points, and we've gone through the process of elimination 203 00:12:54,020 --> 00:12:58,460 and figured out which respawn point is the farthest away from our eye. 204 00:12:58,730 --> 00:13:01,850 And what we're going to do is we're going to check if our player has a character. 205 00:13:01,850 --> 00:13:07,760 If for some reason our player does not have a character, then we're going to load this player's character. 206 00:13:07,760 --> 00:13:13,850 So we use the low character function, and then we're going to set the player's team equal to the alive 207 00:13:13,880 --> 00:13:14,510 team. 208 00:13:15,230 --> 00:13:20,930 And we're going to set this player character humanoid route part dot C frame. 209 00:13:20,930 --> 00:13:24,380 We're going to set that equal to the selected respawn point dot C frame. 210 00:13:24,380 --> 00:13:26,090 So now they're inside of the map. 211 00:13:26,360 --> 00:13:30,890 And the last thing we need to do is that since our player is not going to have any tools, we need to 212 00:13:30,890 --> 00:13:32,000 go ahead and give them some. 213 00:13:32,000 --> 00:13:34,550 So we're going to clone our flashlight tool. 214 00:13:34,550 --> 00:13:39,470 We can just call this flashlight clone and that's in server storage dot tools dot flashlight. 215 00:13:39,470 --> 00:13:40,490 We're going to clone that. 216 00:13:40,490 --> 00:13:42,590 And we're also going to give them a glow stick. 217 00:13:42,590 --> 00:13:47,750 So glow stick clone is in server storage dot tools dot glow stick. 218 00:13:47,750 --> 00:13:49,280 And we're going to clone that as well. 219 00:13:49,580 --> 00:13:53,660 And then we can set the flashlight clone dot parent equal to this player's backpack. 220 00:13:54,530 --> 00:13:57,320 And let me denote this as a player here real quick. 221 00:13:58,190 --> 00:14:02,630 And then for the same thing with our glow stick, we're going to set the parent equal to the player's 222 00:14:02,630 --> 00:14:03,470 backpack. 223 00:14:04,580 --> 00:14:09,680 And after we do all of that, then we can go ahead and notify this player that they've been successfully 224 00:14:09,680 --> 00:14:10,280 respawned. 225 00:14:10,280 --> 00:14:16,010 So again, if you remember in our game comms event, we can fire to this particular player here and 226 00:14:16,010 --> 00:14:23,360 give them the action in our game comms enum dot two client that their respawn were granted and because 227 00:14:23,360 --> 00:14:28,490 their respawn was granted, that means our player needs to disable the night vision that they had when 228 00:14:28,490 --> 00:14:33,800 they were spectating, and they also need to disable their spectating frame and reset their camera. 229 00:14:34,570 --> 00:14:40,150 So back inside of our main guy handler, what we can do is we can go ahead and listen to the game comms 230 00:14:40,150 --> 00:14:45,790 event in there and listen to the on client event and connect a function to this and get the action and 231 00:14:45,790 --> 00:14:47,650 the arguments supplied from the server. 232 00:14:47,830 --> 00:14:55,510 And we can go ahead and check if this action is equal to the game comms enum dot two client dot respawn. 233 00:14:55,510 --> 00:15:01,240 Granted, if it is, then we need to set the spectate frames visibility equal to false, and then we 234 00:15:01,240 --> 00:15:07,990 need to use our manipulate camera Bindable and fire and give the action dot two client of toggle Night 235 00:15:07,990 --> 00:15:08,350 Vision. 236 00:15:08,350 --> 00:15:13,780 We want to turn our night vision off, so we need to set the set on variable equal to false. 237 00:15:13,990 --> 00:15:19,450 And then we also want to use this event as well to go ahead and reset our camera back to the default. 238 00:15:19,450 --> 00:15:24,490 So we're going to give them the action two client dot reset camera. 239 00:15:24,490 --> 00:15:27,520 And I think that's all we need to do for this event. 240 00:15:28,050 --> 00:15:34,440 So now any time our player clicks that respawn button, we're going to request to the server to respawn. 241 00:15:34,470 --> 00:15:39,000 The server is going to ensure that everything checks out and then prompts us a purchase. 242 00:15:39,000 --> 00:15:43,200 And if we purchase that product, then it's going to process the receipt. 243 00:15:43,200 --> 00:15:47,970 It's going to execute the functionality for that particular product and everything should be good to 244 00:15:47,970 --> 00:15:48,390 go. 245 00:15:48,390 --> 00:15:52,800 So now we should be able to test whether or not our developer product is actually working. 246 00:15:52,800 --> 00:15:56,640 So let's go ahead and test out with a three player server and I'll meet you there. 247 00:15:57,800 --> 00:15:58,430 Alrighty. 248 00:15:58,430 --> 00:16:02,930 So one of my players has died and they're currently spectating our two other players, and now we can 249 00:16:02,930 --> 00:16:04,970 test whether or not our respawn button works. 250 00:16:04,970 --> 00:16:07,640 So if I hit this there we go. 251 00:16:07,640 --> 00:16:10,130 We get prompted to purchase the respawn. 252 00:16:10,130 --> 00:16:14,960 And the great thing about testing in studio is that this is a test purchase and we will not be charged. 253 00:16:14,960 --> 00:16:16,880 So this is just an example purchase. 254 00:16:16,880 --> 00:16:22,040 But if I purchase this, hopefully I should get respawned into the map, so I'm going to buy it. 255 00:16:22,980 --> 00:16:23,760 And there we go. 256 00:16:23,760 --> 00:16:27,030 Your purchase of respawn succeeded and we hit okay. 257 00:16:27,030 --> 00:16:27,990 And guess what? 258 00:16:28,020 --> 00:16:33,930 Now we are back inside of the map with our tools and everything has been reset and we're back inside 259 00:16:33,930 --> 00:16:34,680 of our basement. 260 00:16:34,680 --> 00:16:35,460 Beautiful. 261 00:16:36,000 --> 00:16:39,060 Now that means we can purchase this product multiple times. 262 00:16:39,060 --> 00:16:43,710 So if I go and die again, let me just have myself die. 263 00:16:43,770 --> 00:16:46,080 Let me go try to find where Squidward is at. 264 00:16:47,160 --> 00:16:48,450 He sounds like he's in here. 265 00:16:48,450 --> 00:16:49,170 There we go. 266 00:16:55,820 --> 00:16:59,000 And I have died again and I'm back spectating these players. 267 00:16:59,000 --> 00:17:05,030 But thankfully, if I just spend more money and I hit the respawn button and I buy it again, there 268 00:17:05,030 --> 00:17:05,600 we go. 269 00:17:05,600 --> 00:17:11,990 And we have now successfully respawned back into our game once more to try and escape our basement. 270 00:17:11,990 --> 00:17:13,040 Beautiful. 271 00:17:14,420 --> 00:17:19,760 So our developer product system is working great and you can easily add more developer products if you 272 00:17:19,760 --> 00:17:24,710 wish in the future, and you're able to handle them all directly from our developer product service 273 00:17:24,710 --> 00:17:25,760 module script.